/*
 * Salmane y Alberto
 */
package infb.actions;

import infb.dao.MedicosInterfaz;
import infb.dao.PacientesInterfaz;
import infb.dao.PartesMedicosInterfaz;
import infb.errores.GestionHospitalariaException;
import infb.forms.SetPartesMedicosForm;
import infb.modelo.Medicos;
import infb.modelo.Pacientes;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import infb.modelo.PartesMedicos;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.struts.action.*;
import javax.servlet.http.*;

public class GestionPartesMedicosAction extends Action {

    private ActionForward VerHistorial(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PacientesInterfaz pacientes = (PacientesInterfaz) contexto.lookup("PacientesEJB");

            PartesMedicosInterfaz partesMedicos = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");
            Long idPaciente = new Long(peticion.getParameter("id"));
            List<PartesMedicos> listaPartesMedicos = partesMedicos.ListarHistorialPaciente(idPaciente);
            int i = listaPartesMedicos.size();
            if (i == 0) {
                listaPartesMedicos = null;
            }
            peticion.setAttribute("lista_partesMedicos", listaPartesMedicos);
            Pacientes paciente = pacientes.find(idPaciente);
            String nombre = paciente.getNombre();
            String apellido1 = paciente.getApellido1();
            String apellido2 = paciente.getApellido2();
            if(apellido2==null){apellido2="";}
            String nombreCompleto = nombre + " " + apellido1 + " " + apellido2;
            peticion.setAttribute("nombreCompleto", nombreCompleto);



        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        } catch (NumberFormatException nfe) {
            throw new GestionHospitalariaException("Error: El identificador del paciente debe ser un cadena " + nfe.getMessage());
        }
        return mapping.findForward("ok");

    }
     private ActionForward VerTratamiento(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PacientesInterfaz pacientes = (PacientesInterfaz) contexto.lookup("PacientesEJB");

            PartesMedicosInterfaz partesMedicos = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");
            HttpSession sesion=peticion.getSession();
            Long idPaciente = (Long)sesion.getAttribute("id");

            List<PartesMedicos> listaPartesMedicos = partesMedicos.TratamientoActual(idPaciente);
            int i = listaPartesMedicos.size();
            if (i == 0) {
                listaPartesMedicos = null;
            }
            peticion.setAttribute("lista_partesMedicos", listaPartesMedicos);
            Pacientes paciente = pacientes.find(idPaciente);
            String nombre = paciente.getNombre();
            String apellido1 = paciente.getApellido1();
            String apellido2 = paciente.getApellido2();
            if(apellido2==null){apellido2="";}
            String nombreCompleto = nombre + " " + apellido1 + " " + apellido2;
            peticion.setAttribute("nombreCompleto", nombreCompleto);



        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PacientesInterfaz " + ne.getMessage());
        } catch (NumberFormatException nfe) {
            throw new GestionHospitalariaException("Error: El identificador del paciente debe ser un cadena " + nfe.getMessage());
        }
        return mapping.findForward("ok");

    }


    private ActionForward ConsultarHistorial(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        return mapping.findForward("ok");
    }

    private ActionForward prepararInsercion(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException {
        Context contexto = new InitialContext();
        PacientesInterfaz iPacientes = (PacientesInterfaz) contexto.lookup("PacientesEJB");
        HttpSession sesion = peticion.getSession();
        sesion.removeAttribute("objetoModificar");
        sesion.removeAttribute("pacienteActual");

        Long idPaciente = (Long)sesion.getAttribute("id");
        Pacientes paciente=(Pacientes) iPacientes.find(idPaciente);
        sesion.setAttribute("pacienteActual", paciente);
        
        Date fecha = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
        String fechaTramitacion=sdf.format(fecha);
        sesion.setAttribute("fechaTramit", fechaTramitacion);

        return mapping.findForward("preparar_ok");
    }

    private ActionForward cargarParteMedico(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PartesMedicosInterfaz partesMedicos = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");
            PacientesInterfaz iPacientes = (PacientesInterfaz) contexto.lookup("PacientesEJB");
            Long idParteMedico = new Long(peticion.getParameter("id"));
            PartesMedicos parteMedico = partesMedicos.find(idParteMedico);
            if (parteMedico == null) {
                throw new GestionHospitalariaException("Error: El identificador del parte medico pasado como parámetro no existe");
            }

            // Incorporamos el bean en la sesion
            HttpSession sesion = peticion.getSession();
            sesion.removeAttribute("objetoModificar");
            sesion.removeAttribute("pacienteActual");

            sesion.setAttribute("objetoModificar", parteMedico);

            String idPaciente = parteMedico.getPaciente();
            Pacientes paciente=(Pacientes) iPacientes.find(idPaciente);
            if (paciente == null) {
                throw new GestionHospitalariaException("Error: El identificador del paciente del parte medico no existe");
            }
            sesion.setAttribute("pacienteActual", paciente);

            Date fecha = parteMedico.getFechaTramitacion();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
            String fechaTramitacion=sdf.format(fecha);
            sesion.setAttribute("fechaTramit", fechaTramitacion);

            // Redirigimos hacia la vista
            return mapping.findForward("cargar_ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PartesMedicosInterfaz " + ne.getMessage());
        } catch (NumberFormatException nfe) {
            throw new GestionHospitalariaException("Error: El identificador del parte medico debe ser un numero " + nfe.getMessage());
        }
    }

    private ActionForward insertarParteMedico(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PartesMedicosInterfaz partesMedicos = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");
            SetPartesMedicosForm formularioDatos = (SetPartesMedicosForm) form;

            PartesMedicos parteMedico = new PartesMedicos();

            //creo q hay q meterle un "paciente" no solo el nombre
            parteMedico.setPaciente(formularioDatos.getPaciente());
            //recuperamos el medico
            MedicosInterfaz medicos = (MedicosInterfaz) contexto.lookup("MedicosEJB");
            String idMedico = formularioDatos.getMedico();  // en id tenemos el DNI del medico
            Medicos medico = medicos.find(idMedico);
            if (medico == null) {
                throw new GestionHospitalariaException("Error: El identificador (DNI) del medico pasado como parámetro no existe");
            }
            parteMedico.setMedico(medico);
            parteMedico.setSintomas(formularioDatos.getSintomas());
            parteMedico.setDiagnostico(formularioDatos.getDiagnostico());
            parteMedico.setTratamiento(formularioDatos.getTratamiento());

            String fechaCad = formularioDatos.getFechaTramitacion();
            Date fechaTramitacion;
            if (!fechaCad.equals("")) {
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
                fechaTramitacion = sdf.parse(fechaCad);
            } else {
                fechaTramitacion = null;
            }
            parteMedico.setFechaTramitacion(fechaTramitacion);

            String fechaCad1 = formularioDatos.getFechaFinalizacion();
            Date fechaFinalizacion;
            if (!fechaCad1.equals("")) {
                SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yy");
                fechaFinalizacion = sdf1.parse(fechaCad1);
            } else {
                fechaFinalizacion = null;
            }
            parteMedico.setFechaFinalizacion(fechaFinalizacion);

            Short privado = Short.valueOf(formularioDatos.getPrivado());
            parteMedico.setPrivado(privado);

            partesMedicos.create(parteMedico);

            peticion.setAttribute("mensaje", "El parte del paciente ha sido insertado correctamente");
            peticion.setAttribute("urlRetorno", "index.jsp");

            return mapping.findForward("ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PartesMedicosInterfaz " + ne.getMessage());
        } catch (Exception e) {
            throw new GestionHospitalariaException("Error: No se pudo insertar correctamente el parte medico en la Base de Datos " + e.getMessage());
        }
    }

    private ActionForward modificarParteMedico(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PartesMedicosInterfaz partesMedicos = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");
            SetPartesMedicosForm formularioDatos = (SetPartesMedicosForm) form;

            HttpSession sesion = peticion.getSession();
            PartesMedicos parteMedico = partesMedicos.find(((PartesMedicos) sesion.getAttribute("objetoModificar")).getId());

            //creo q hay q meterle un "paciente" no solo el nombre
            parteMedico.setPaciente(formularioDatos.getPaciente());
            //recuperamos el medico
            MedicosInterfaz medicos = (MedicosInterfaz) contexto.lookup("MedicosEJB");
            String idMedico = formularioDatos.getMedico(); //peticion.getParameter("id");    // en id tenemos el DNI del medico
            Medicos medico = medicos.find(idMedico);
            if (medico == null) {
                throw new GestionHospitalariaException("Error: El identificador (DNI) del medico pasado como parámetro no existe");
            }
            parteMedico.setMedico(medico);
            parteMedico.setSintomas(formularioDatos.getSintomas());
            parteMedico.setDiagnostico(formularioDatos.getDiagnostico());
            parteMedico.setTratamiento(formularioDatos.getTratamiento());

             String fechaCad = formularioDatos.getFechaTramitacion();
            Date fechaTramitacion;
            if (!fechaCad.equals("")) {
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");
                fechaTramitacion = sdf.parse(fechaCad);
            } else {
                fechaTramitacion = null;
            }
            parteMedico.setFechaTramitacion(fechaTramitacion);


            String fechaCad1 = formularioDatos.getFechaFinalizacion();
            Date fechaFinalizacion;
            if (!fechaCad1.equals("")) {
                SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yy");
                fechaFinalizacion = sdf1.parse(fechaCad1);
            } else {
                fechaFinalizacion = null;
            }
            parteMedico.setFechaFinalizacion(fechaFinalizacion);

            Short privado = Short.valueOf(formularioDatos.getPrivado());
            parteMedico.setPrivado(privado);

            partesMedicos.edit(parteMedico);

            sesion.removeAttribute("objetoModificar");
            peticion.setAttribute("mensaje", "El medicamento ha sido modificado correctamente");
            peticion.setAttribute("urlRetorno", "index.jsp");

            return mapping.findForward("ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PartesMedicosInterfaz " + ne.getMessage());
        } catch (Exception e) {
            throw new GestionHospitalariaException("Error: No se pudo modificar correctamente el parte medico en la Base de Datos " + e.getMessage());
        }
    }

    private ActionForward eliminarPartesMedicos(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException {
        try {
            Context contexto = new InitialContext();
            PartesMedicosInterfaz partesMedicos = (PartesMedicosInterfaz) contexto.lookup("PartesMedicosEJB");

            PartesMedicos parteMedico;

            String[] arrayNombres = peticion.getParameterValues("id");
            List listaNombres = new ArrayList();
            listaNombres = arrayToList(arrayNombres);

            for (int i = 0; i < listaNombres.size(); i++) {
                Long med = Long.valueOf((String) listaNombres.get(i));
                parteMedico = partesMedicos.find(med);
                partesMedicos.remove(parteMedico);
            }
            return mapping.findForward("ok");
        } catch (NamingException ne) {
            throw new GestionHospitalariaException("Error: No se pudo cargar la clase DAO PartesMedicosInterfaz " + ne.getMessage());
        } catch (Exception e) {
            throw new GestionHospitalariaException("Error: No se pudo eliminar correctamente el parte medico de la Base de Datos " + e.getMessage());
        }
    }

    private <T> List<T> arrayToList(T[] array) {
        List lista = new ArrayList<T>();
        if (array != null) {
            for (int i = 0; i < array.length; i++) {
                lista.add(array[i]);
            }
        }
        return lista;
    }

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest peticion, HttpServletResponse respuesta) throws GestionHospitalariaException, NamingException {
        String delegaEn = mapping.getParameter();
        if (delegaEn.equalsIgnoreCase("preparar_insercion")) {
            // codigo para crear un medicamento
            return this.prepararInsercion(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("cargar")) {
            // cargar los datos de un medicamento
            return this.cargarParteMedico(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("insertar")) {
            // insertar un medicamento
            return this.insertarParteMedico(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("modificar")) {
            // modificar un medicamento
            return this.modificarParteMedico(mapping, form, peticion, respuesta);
            } else if (delegaEn.equalsIgnoreCase("ver_tratamiento")) {
            // modificar un medicamento
            return this.VerTratamiento(mapping, form, peticion, respuesta);
        } else if (delegaEn.equalsIgnoreCase("eliminar")) {
            // borrar un medicamento
            return this.eliminarPartesMedicos(mapping, form, peticion, respuesta);
        }
        if (delegaEn.equalsIgnoreCase("ver_historial")) {
            // ver historial de un paciente
            return this.VerHistorial(mapping, form, peticion, respuesta);
        } else {
            return this.ConsultarHistorial(mapping, form, peticion, respuesta);
        }
    }
}
